// webpack.config.server.js
const nodeExternals = require("webpack-node-externals");
const path = require("path");
const CopyPlugin = require("copy-webpack-plugin");
const TsConfigPathsPlugin = require("tsconfig-paths-webpack-plugin");
//CopyPlugin 是 Webpack 的一个插件，用于在构建过程中将文件或目录从源路径复制到目标路径。
// 它的主要作用是确保某些静态资源（如 HTML 文件、图片、配置文件等）能够被正确地复制到输出目录中，而无需经过 Webpack 的复杂处理。

module.exports = {
  // 配置名
  name: "server",
  entry: {
    // 指明 应用程序的入口文件地址
    server: path.resolve(__dirname, "server/server.ts"),
  },
  // 设置构建模式为生产环境（production），启用相关的优化和压缩功能。
  mode: "production",
  // mode: "development",
  output: {
    // 指明输出文件的地址 以及生成的文件名根据入口名称动态生成，例如server.js。
    path: path.resolve(__dirname, "dist"),
    filename: "[name].js",
  },
  resolve: {
    // 配置 webpack 解析模块时的拓展名
    extensions: [".ts", ".tsx"],
    alias: {
      "@": path.resolve(__dirname, "./"),
    },
  },
  // 对应 webpack-node-externals 包 ， 将node.js 的内置模块和依赖库排除 ，避免重复打包，因为这些模块在运行时已经存在于Node.js环境中。
  externals: [nodeExternals()],
  // 指明运行环境为 node.js
  target: "node",
  node: {
    //禁用__dirname的 polyfill，确保在Node.js环境中使用原生的__dirname。
    __dirname: false,
  },
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        //使用ts-loader加载器来处理这些TypeScript文件。ts-loader会将TypeScript代码编译成JavaScript代码。
        loader: "ts-loader",
        options: {
          //指定TypeScript编译时使用的配置文件
          configFile: "tsconfig.server.json",
        },
      },
    ],
  },
  plugins: [
    /*
    new CopyPlugin({...})：创建一个新的 CopyPlugin 实例，并传递一个配置对象。
    patterns：这是一个数组，定义了要复制的文件或目录的模式。
    context：指定相对于项目的根目录的路径。在这个例子中，context 设置为 'server'，表示从 server 目录开始查找文件。
    from：指定要复制的源目录或文件。在这个例子中，from 设置为 'views'，表示要复制 server/views 目录下的所有文件。
    to：指定目标目录。在这个例子中，to 也设置为 'views'，表示将 server/views 目录下的所有文件复制到输出目录dist的 views 目录中
  */
    new CopyPlugin({
      patterns: [{ context: "server", from: "views", to: "views" }],
    }),
  ],
};
